package com.whfc.base.dao;

import com.whfc.base.dto.MsgRecordDTO;
import com.whfc.base.dto.MsgStatisticsDTO;
import com.whfc.base.entity.AppMessage;
import com.whfc.base.param.WarnMsgSearchParam;
import com.whfc.entity.dto.msg.AppMsgModuleTypeNumDTO;
import com.whfc.entity.dto.msg.AppWarnMsgDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

@Repository
public interface AppMessageMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(AppMessage record);

    int insertSelective(AppMessage record);

    AppMessage selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(AppMessage record);

    int updateByPrimaryKey(AppMessage record);

    List<AppMessage> searchAllByMsgObjectId(@Param("msgObjectId") String msgObjectId);

    /**
     * 批量插入
     *
     * @param messageList
     * @return
     */
    int batchInsert(List<AppMessage> messageList);

    /**
     * 批量设置消息已读
     *
     * @param idList
     * @param readTime
     * @return
     */
    int batchUpdateMsgRead(@Param("idList") List<Integer> idList, @Param("readTime") Date readTime);

    /**
     * 更新短信发送状态
     *
     * @param id
     * @return
     */
    int updateSmsState(@Param("id") Integer id);

    /**
     * 批量设置消息已读
     *
     * @param userId
     * @param deptId
     * @param moduleType
     * @return
     */
    int updateMsgReadByUserIdAndDeptId(@Param("userId") Integer userId,
                                       @Param("deptId") Integer deptId,
                                       @Param("moduleType") Integer moduleType);

    /**
     * 批量设置消息已读
     *
     * @param phone
     * @param deptId
     * @param moduleType
     * @return
     */
    int updateMsgReadByUserPhoneAndDeptId(@Param("phone") String phone,
                                       @Param("deptId") Integer deptId,
                                       @Param("moduleType") Integer moduleType);

    /**
     * 逻辑删除消息
     *
     * @param idList
     * @return
     */
    int deleteLogicByIds(@Param("list") List<Integer> idList);

    /**
     * 根据用户和项目删除消息
     *
     * @param userId
     * @param deptId
     * @param moduleType
     * @param state
     * @return
     */
    int delLogicByUserIdAndDeptId(@Param("userId") Integer userId,
                                  @Param("deptId") Integer deptId,
                                  @Param("moduleType") Integer moduleType,
                                  @Param("state") Integer state);

    /**
     * 根据用户和项目删除消息
     *
     * @param phone
     * @param deptId
     * @param moduleType
     * @param state
     * @return
     */
    int delLogicByUserPhoneAndDeptId(@Param("phone") String phone,
                                  @Param("deptId") Integer deptId,
                                  @Param("moduleType") Integer moduleType,
                                  @Param("state") Integer state);
    /**
     * 获取后台未读消息数
     *
     * @param deptIds
     * @param phone
     * @param msgChannel
     * @return
     */
    List<AppMsgModuleTypeNumDTO> selectUnreadMsgNumDTOList(@Param("deptIds") List<Integer> deptIds,
                                                           @Param("phone") String phone,
                                                           @Param("msgChannel") Integer msgChannel);

    /**
     * 查询小程序未读消息数
     *
     * @param deptIds
     * @param phone
     * @param msgChannel
     * @return
     */
    List<AppWarnMsgDTO> selectWxUnreadMsgNumList(@Param("deptIds") List<Integer> deptIds,
                                                 @Param("phone") String phone,
                                                 @Param("msgChannel") Integer msgChannel);

    /**
     * 查询报警消息列表
     *
     * @param deptIds
     * @param phone
     * @param readState
     * @param msgChannel
     * @param moduleType
     * @return
     */
    List<AppWarnMsgDTO> selectWarnMsgDTOList(@Param("deptIds") List<Integer> deptIds,
                                             @Param("phone") String phone,
                                             @Param("readState") Integer readState,
                                             @Param("msgChannel") Integer msgChannel,
                                             @Param("moduleType") Integer moduleType);


    List<MsgStatisticsDTO> selectWarnMsgStatistics(@Param("deptIds") List<Integer> deptIds, @Param("moduleTypes") List<Integer> moduleTypes, @Param("userId") Integer userId, @Param("msgChannel") Integer msgChannel, @Param("state") Integer state);

    Date selectLastTime(@Param("deptIds") List<Integer> deptIds, @Param("moduleType") Integer moduleType, @Param("userId") Integer userId, @Param("msgChannel") Integer msgChannel, @Param("state") Integer state);

    List<MsgRecordDTO> selectWarnMsgPage(@Param("param") WarnMsgSearchParam param);
}